package com.zx.template.base;


import com.zx.template.constant.BaseConstants;
import lombok.*;

import java.io.Serializable;

@Getter
@Setter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class R<T> implements Serializable {
    
    
    private String code;
    private String message;
    private T data;
    

    public static <T> R<T> ok() {
        return ok(BaseConstants.SUCCESS_MSG, null);
    }

    public static <T> R<T> ok(T t) {
        return ok(BaseConstants.SUCCESS_MSG, t);
    }

    public static <T> R<T> ok(String msg) {
        return ok(msg, null);
    }

    public static <T> R<T> ok(String msg, T t) {
        return new R<>(BaseConstants.SUCCESS, msg, t);
    }

    public static <T> R<T> fail(String code, String msg, T t) {
        return new R<>(code == null || BaseConstants.SUCCESS.equals(code) ? BaseConstants.FAIL : code, msg, t);
    }

    public static <T> R<T> fail(String msg, T t) {
        return new R<>(BaseConstants.FAIL, msg, t);
    }

    public static <T> R<T> fail(String msg) {
        return fail(msg, null);
    }

    public static R<Throwable> fail(Throwable e) {
        e.printStackTrace();
        return fail(BaseConstants.FAIL_MSG, e);
    }

    public static <T> R<T> fail(Throwable e, T t) {
        e.printStackTrace();
        return fail(BaseConstants.FAIL_MSG + e.getMessage(), t);
    }

    /** 适合对接第三方的时候，统一处理返回（fastjson 也是类似处理）
     * @param objStr objStr
     * @param clz list 元素类型
     * @param <T> 泛型
     * @return
     */
//    public static <T> List<T> toList(String objStr,Class<T> clz){
//        R<List<T>> bean = JSONUtil.toBean(objStr, new TypeReference<R<List<T>>>() {
//        }, false);
//        return JSONUtil.toList(JSONUtil.toJsonStr(bean.getData()),clz);
//    }
    
    // 若是 非包装类 boolean lombok 会当成一个属性
    public Boolean isOk() {
        return BaseConstants.SUCCESS.equals(this.code);
    }

   
}